向裸机工程添加FreeRTOS源码

← FreeRTOS | ← 主页

先了解一下有哪些文件:Freertos文件组成


1. 下载源码

FreeRTOS GitHub Releases 页 下载源码压缩包,解压后按下面的步骤搬文件

2. 工程中新建文件夹

工程根目录/
└─ FreeRTOS/
   ├─ src/      ← 内核 .c 文件
   ├─ port/     ← 移植层
   └─ include/  ← 内核头文件

3. 复制内核头文件

源码包 FreeRTOS/Source/include/ 整个文件夹复制到工程 FreeRTOS/ 下,与 src、port 同级(即 FreeRTOS/include/)

4. 复制内核源码与移植层

  • FreeRTOS/Source/ 下所有 .c(tasks.c、queue.c、list.c、timers.c、event_groups.c、stream_buffer.c、croutine.c)→ FreeRTOS/src/
  • FreeRTOS/Source/portable/ 下复制 MemMang 和 RVDS 两个文件夹 → FreeRTOS/port/
    • 提示:老版源码 Keil 对应目录是 RVDS(AC5 编译器);新版 FreeRTOS-Kernel 改叫 ARMClang(AC6)或 Keil,任选其一

5. 复制 FreeRTOSConfig.h

官方 Demo 里有现成模板:FreeRTOS/Demo/CORTEX_STM32F103_Keil/FreeRTOSConfig.h(任意芯片 demo 都行,后续按需裁剪)→ 放到 FreeRTOS/include/ 里(头文件路径已经加了 include,不用再单独配)

6. Keil 工程分组

工程管理里新建两个组,添加文件:

组添加的文件
FreeRTOS/srcsrc 下所有 .c
FreeRTOS/portport\RVDS\ARM_CM4F\port.c + port\MemMang\heap_4.c(heap 只能选 1 个)

ARM_CM? 按 MCU 内核选:

MCU 内核目录
Cortex-M0 / M0+ARM_CM0
Cortex-M3(STM32F1)ARM_CM3
Cortex-M4 无 FPUARM_CM4
Cortex-M4F(STM32F4)ARM_CM4F
Cortex-M7ARM_CM7

查内核方法:芯片数据手册 / Keil 工程 Device 页看内核名;型号也能猜(F1 后缀 1 → M3,F4 后缀 4 → M4F)

7. 添加头文件路径

Options for Target → C/C++ → Include Paths 添加:

FreeRTOS\include
FreeRTOS\port\RVDS\ARM_CM4F

(ARM_CM4F 换成第 6 步实际选的目录)

8. 中断处理(改 FreeRTOSConfig.h,不动 .s 文件)

在 FreeRTOSConfig.h 的末尾添加 3 行宏定义,强定义自动覆盖启动文件的弱符号,将 FreeRTOS 的中断处理函数名映射为标准中断名:

/* FreeRTOSConfig.h 末尾添加 */
#define vPortSVCHandler     SVC_Handler
#define xPortPendSVHandler  PendSV_Handler
#define xPortSysTickHandler SysTick_Handler

然后去 stm32f10x_it.c / stm32f4xx_it.c 中:将原本由编译器/官方库自动生成的 SVC_Handler、PendSV_Handler、SysTick_Handler 三个函数直接注释或删掉(port.c 已经通过宏接管了这三个函数的同名定义,不删会报 symbol multiply defined 重复定义错误)